/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Message.Mensaje;
import SwConfMessage.Interfaz.IArchivo;
import java.io.*;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import mailserver.MailServer1;

/**
 *
 * @author Neyer Canaviri
 */
//public class ArchivoDatos implements Serializable{
/**
 *
 * @author Marisol
 */
public class ArchivoDatos<T> implements IArchivo<T> {

    private LinkedList<Mensaje> mensajes;
    private LinkedList<MailServer1> servidor;
    File file;

    public ArchivoDatos() throws Exception {
//        leerDatos();
        file = null;
    }

//    public ArchivoDatos(int opcion){
//        usuarios = new LinkedList<Usuario>();
//        perfiles = new LinkedList<Perfil>();
//        formularios = new LinkedList<Formulario>();
//        registros = new LinkedList<Registro>();
//        Usuario usuario = new Usuario();
//        usuario.setUsuario("programador");
//        usuario.setContraseÃ±a("g]ghYaU");
//        usuario.setHabilitado(true);
//        usuarios.add(usuario);
//    }
//
//
//
//    public boolean insertarUsuario(Usuario usuario){
//        boolean respuesta = false;
//        try {
//            usuarios.add(usuario);
//            guardarDatos();
//            respuesta = true;
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ArchivoDatos.insertarUsuario", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public boolean actualizarUsuario(Usuario usuario){
//        boolean respuesta = false;
//        try {
//            ListIterator<Usuario> listIterator = usuarios.listIterator();
//            while(listIterator.hasNext()){
//                Usuario usuario1 = listIterator.next();
//                if(usuario1.equals(usuario)){
//                   usuario1.setTelefono(usuario.getTelefono());
//                   usuario1.setPerfil(usuario.getPerfil());
//                   usuario1.setNombre(usuario.getNombre());
//                   usuario1.setContraseÃ±a(usuario.getContraseÃ±a());
//                   usuario1.setHabilitado(usuario.isHabilitado());
//                   usuario1.setDireccion(usuario.getDireccion());
//                   usuario1.setCi(usuario.getCi());
//                   guardarDatos();
//                   respuesta = true;
//                   break;
//                }
//            }
//        } catch (Exception e) {
//            System.out.println("ArchivoDatos.actualizarUsuario " + e.getMessage());
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public boolean eliminarUsuario(Usuario usuario){
//        boolean respuesta = false;
//        try {
//            respuesta = usuarios.remove(usuario);
//            guardarDatos();
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ArchivoDatos.eliminarUsuario", JOptionPane.ERROR_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public LinkedList<Usuario> leerUsuarios(){
//        try {
//            leerDatos();
//        } catch (Exception ex) {
//            Logger.getLogger(ArchivoDatos.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        return usuarios;
//    }
//
//
//
//    public boolean insertarPerfil(Perfil perfil){
//        boolean respuesta = false;
//        try {
//            if(perfiles.add(perfil)){
//                guardarDatos();
//                respuesta = true;
//            }
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ArchivoDatos.insertarPerfil", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public boolean actualizarPerfil(Perfil perfil){
//        boolean respuesta = false;
//        try{
//            Iterator<Perfil> iterator = perfiles.iterator();
//            while(iterator.hasNext()){
//                Perfil perfil1 = iterator.next();
//                if(perfil1.equals(perfil)){
//                    perfil1.setDescripcion(perfil.getDescripcion());
//                    perfil1.setFormularios(perfil.getPerfilFormularios());
//                    respuesta = true;
//                    guardarDatos();
//                    break;
//                }
//            }
//        }catch(Exception e){
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ArchivoDatos.actualizarPerfil", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public boolean eliminarPerfil(Perfil perfil){
//        boolean respuesta = false;
//        try {
//            Iterator<Usuario> iterator = usuarios.iterator();
//            while(iterator.hasNext()){//verifico que no haya un usuario usandolo.
//                Usuario usuario1 = iterator.next();
//                Perfil perfil1 = usuario1.getPerfil();
//                if(perfil1 != null && perfil1.equals(perfil)){
//                    return false;
//                }
//            }
//            if(perfiles.remove(perfil)){
//                guardarDatos();
//                respuesta = true;
//            }
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ArchivoDatos.eliminarPerfil", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public LinkedList<Perfil> leerPerfiles(){
//        try {
//            leerDatos();
//        } catch (Exception ex) {
//            Logger.getLogger(ArchivoDatos.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        return perfiles;
//    }
//
//
//    
//    public boolean insertarFormulario(Formulario formulario){
//        boolean respuesta = false;
//        try {
//            if(!formulario.getNombre().equals("") && formulario.isAdministrable()){
//                Iterator<Formulario> iterator = formularios.iterator();
//                while(iterator.hasNext()){
//                    if(formulario.getNombre().equals(iterator.next().getNombre())){
//                        return false;
//                    }
//                }
//                formularios.add(formulario);
//                guardarDatos();
//                respuesta = true;
//            }
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ContenedorDeDatos.insertarFormulario", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public boolean eliminarFormulario(Formulario formulario){
//        boolean respuesta = false;
//        try {
//            formularios.remove(formulario);
//            guardarDatos();
//            respuesta = true;
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ContenedorDeDatos.eliminarFormulario", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public LinkedList<Formulario> leerFormularios(){
//        return formularios;
//    }
//
//    public int eliminarTodosLosFormularios(){
//        int respuesta = 0;
//        try{
//            int aux = formularios.size();
//            formularios.clear();
//            guardarDatos();
//            respuesta = aux;
//        }catch(Exception e){
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ContenedorDeDatos.eliminarTodosLosFormularios", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//
//    
//    public boolean insertarRegistro(Registro registro){
//        boolean respuesta = false;
//        try {
//            if(registros.add(registro)){
//                guardarDatos();
//                respuesta = true;
//            }
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ContenedorDeDatos.insertarRegistro", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public boolean eliminarRegistro(Registro bitacora){
//        boolean respuesta = false;
//        try {
//            respuesta = registros.remove(bitacora);
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ContenedorDeDatos.eliminarRegistro", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public int eliminarTodosLosRegistros(){
//        int respuesta = 0;
//        try {
//            int aux = registros.size();
//            registros.clear();
//            guardarDatos();
//            respuesta = aux;
//        } catch (Exception e) {
//            JOptionPane.showMessageDialog(null, e.getMessage(), "ContenedorDeDatos.eliminarTodosLosUsuarios", JOptionPane.WARNING_MESSAGE);
//        }finally{
//            return respuesta;
//        }
//    }
//
//    public LinkedList<Registro> leerRegistros(){
//        try {
//            leerDatos();
//        } catch (Exception ex) {
//            Logger.getLogger(ArchivoDatos.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        return registros;
//    }
//
//
//
    public Object leerDatos(String name) throws Exception {
        Object data = null;

        File file = new File(new File("").getAbsolutePath() + File.separator + name + ".bo");

        if (file.exists()) {
//           
            FileInputStream fileInputStream1 = new FileInputStream(file);
            ObjectInputStream objectInputStream1 = new ObjectInputStream(fileInputStream1);
            data = objectInputStream1.readObject();
//           

            objectInputStream1.close();
            fileInputStream1.close();
        }

        return (data);
    }

    public void guardarDatos(String name, Object data) throws Exception {

        File file = new File(new File("").getAbsolutePath() + File.separator + name + ".bo");
        if (file.exists()) {
//            FileInputStream fileInputStream = new FileInputStream(file);
//            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
//            String direccion = (String) objectInputStream.readObject();
//            
////             String direccion = "Servidor"+ ;
//            objectInputStream.close();
//            fileInputStream.close();

//            File file1 = new File(direccion);
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);



            objectOutputStream.writeObject(data);
            objectOutputStream.close();
            fileOutputStream.close();
        } else {

            FileWriter escribir = new FileWriter(file, true);
            escribir.close();
            guardarDatos(name, data);
        }

    }

//    public boolean existe(String nameArchivo) {
//
//        File file = new File(new File("").getAbsolutePath() + File.separator + nameArchivo + ".bo");
//
//        return file.exists();
//
//    }
    public static void main(String[] args) {
        // TODO code application logic here

        File file = new File(new File("").getAbsolutePath() + File.separator + "adriana.bo");



    }

//    @Override
//    public void guardar(Object objeto, String Pach, String nombreArchivo, String extension) throws Exception {
//    }
//
//    @Override
//    public Object recuperar(String Pach, String nombreArchivo, String extension) throws Exception {
//         Object data = null;
//
//        File file = new File(new File("").getAbsolutePath() + File.separator + name + ".bo");
//
//        if (file.exists()) {
////           
//            FileInputStream fileInputStream1 = new FileInputStream(file);
//            ObjectInputStream objectInputStream1 = new ObjectInputStream(fileInputStream1);
//            data = objectInputStream1.readObject();
////           
//
//            objectInputStream1.close();
//            fileInputStream1.close();
//        }
//
//        return (data);
//    }
    @Override
    public void guardar(T objeto, String Pach, String nombreArchivo, String extension) throws Exception {

        file = new File(Pach + File.separator + nombreArchivo + "." + extension);
        if (file.exists()) {

            FileOutputStream fileOutputStream = new FileOutputStream(file);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(objeto);
            objectOutputStream.close();
            fileOutputStream.close();
            file = null;
            return;
        }

        FileWriter escribir = new FileWriter(file, true);
        escribir.close();
        file = null;
        guardar(objeto, Pach, nombreArchivo, extension);

    }

    public void guardarMensaje(T dato, String direccion) {
        FileWriter escribir = null;
        try {
            file = new File(direccion);
            escribir = new FileWriter(file, true);
            escribir.write((String) dato);
            escribir.close();
            file = null;

        } catch (IOException ex) {
            Logger.getLogger(ArchivoDatos.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                escribir.close();
            } catch (IOException ex) {
                Logger.getLogger(ArchivoDatos.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    @Override
    public T recuperar(String Pach, String nombreArchivo, String extension) throws Exception {
        T data = null;

        file = new File(Pach + File.separator + nombreArchivo + "." + extension);

        if (file.exists()) {
//           
            FileInputStream fileInputStream1 = new FileInputStream(file);
            ObjectInputStream objectInputStream1 = new ObjectInputStream(fileInputStream1);
            data = (T) objectInputStream1.readObject();
//           

            objectInputStream1.close();
            fileInputStream1.close();
            file = null;
        }

        return (data);
    }

    @Override
    public boolean existe(String Pach, String nombreArchivo, String extension) throws Exception {
        file = new File(Pach + File.separator + nombreArchivo + "." + extension);
        boolean exist;
        exist = file.exists();
        file = null;
        return exist;
    }
}
